package 算法基础模板.chapter_01.双指针.sliding_window;

/**
 * 1004. 最大连续1的个数 III
 * 给定一个由若干 0 和 1 组成的数组 A，我们最多可以将 K 个值从 0 变成 1 。
 * <p>
 * 返回仅包含 1 的最长（连续）子数组的长度。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
 * 输出：6
 * 解释：
 * [1,1,1,0,0,1,1,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 6。
 * 示例 2：
 * <p>
 * 输入：A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
 * 输出：10
 * 解释：
 * [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
 * 粗体数字从 0 翻转到 1，最长的子数组长度为 10。
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= A.length <= 20000
 * 0 <= K <= A.length
 * A[i] 为 0 或 1
 *
 * @author Summerday
 */
public class LC1004 {
    // 求一段 0的个数不超过k 的最长一段
    public int longestOnes (int[] nums, int k) {
        int l = 0, r = 0, ans = 0, t = 0, n = nums.length;
        while (r < n) {
            // 遇到0 , 计数 + 1
            if (nums[r] == 0) {
                t++;
            }
            // 超过k 移动左边界
            while (t > k) {
                if (nums[l++] == 0) {
                    t--;
                }
            }
            ans = Math.max(ans, r - l + 1);
            r++;
        }
        return ans;
    }
}
